# 词法分析器编译Makefile

CC = gcc
CFLAGS = -Wall -O0 -g3 -ggdb -fPIC
LDFLAGS = -shared

# 平台特定设置
ifeq ($(OS),Windows_NT)
    LIB_SUFFIX = .dll
else
    UNAME_S := $(shell uname -s)
    ifeq ($(UNAME_S),Darwin)
        LIB_SUFFIX = .dylib
    else
        LIB_SUFFIX = .so
    endif
endif

# 库路径定义 - 如果顶层Makefile传入则使用该值
LIB_DIR ?= ../lib

# 目标文件名
TARGET = $(LIB_DIR)/clexer2$(LIB_SUFFIX)
LOCAL_TARGET = clexer2$(LIB_SUFFIX)

# 源文件和目标文件
SOURCES = c_lexer.c
OBJECTS = $(SOURCES:.c=.o)
# 头文件目录
INCLUDES = -I..

# 默认目标
all: $(TARGET) $(LOCAL_TARGET)

# 构建动态库 - 链接到core和vm库
$(TARGET): $(OBJECTS)
	@mkdir -p $(LIB_DIR)
	$(CC) $(LDFLAGS) -o $@ $(OBJECTS) -L$(LIB_DIR) -lcore2 -lcvm2
	@echo "已构建 lexer 库: $@"

# 在当前目录构建动态库
$(LOCAL_TARGET): $(OBJECTS)
	$(CC) $(LDFLAGS) -o $@ $(OBJECTS) -L$(LIB_DIR) -lcore2 -lcvm2
	@echo "已在当前目录构建 lexer 库: $@"

# 编译规则 - 确保不定义LEXER_MAIN，避免包含main函数
%.o: %.c
	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

# 独立可执行文件的编译规则 - 这里定义LEXER_MAIN
c_lexer.exe: c_lexer.c
	$(CC) $(CFLAGS) -DLEXER_MAIN $(INCLUDES) -o $@ $< -L$(LIB_DIR) -lcore2 -lcvm2
	@echo "已构建词法分析器测试程序: $@"

# 清理规则
clean:
	rm -f $(OBJECTS)
	rm -f $(TARGET)
	rm -f $(LOCAL_TARGET)
	rm -f c_lexer.exe test_lexer.exe
	rm -f *$(LIB_SUFFIX)
	@echo "Lexer module cleaned"

# 测试可执行程序
test_lexer: test_lexer.c $(LOCAL_TARGET)
	$(CC) $(CFLAGS) $(INCLUDES) -o $@ $< -L. -lclexer2 -L$(LIB_DIR) -lcore2 -lcvm2
	@echo "已构建词法分析器测试程序: $@"

# 帮助信息
help:
	@echo "可用目标:"
	@echo "  all        - 构建词法分析器库"
	@echo "  clean      - 清理生成的文件"
	@echo "  test_lexer - 构建测试程序"
	@echo "  c_lexer.exe - 构建独立的词法分析器程序"
	@echo "  help       - 显示此帮助信息"

.PHONY: all clean help test_lexer c_lexer.exe 